#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time   : 2021/6/23 21:47
# @Author : cjw
import os
import time
from typing import Optional

import allure
import pytest
from web_wework.page.main_page import MainPage
from web_wework.util.log import logger
from web_wework.util.generate_data import GenerateData

m_page: Optional[MainPage] = None  # 微信首页
gd: GenerateData = GenerateData()  # 数据生成器


@pytest.fixture()
def main_page():
    """
    每次用例执行，都需要创建一个新的driver驱动，所以都需要创建一个主页的实例
    :return:
    """
    global m_page
    logger.info('启动浏览器, 进入首页...')
    m_page = MainPage()
    yield m_page, gd
    logger.info('关闭浏览器...')
    m_page.driver.quit()


@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):
    """
    获取每个用例状态的钩子函数，进行失败用例截图

    具体执行过程如下：
    1、先执行when='setup'，返回setup 的执行结果
    2、然后执行when='call'，返回call 的执行结果
    3、最后执行when='teardown'，返回teardown 的执行结果

    运行用例的过程会经历三个阶段:setup-call-teardown,
    每个阶段都会返回的 Result 对象和 TestReport 对象，以及对象属性。
    :param item: 测试用例
    :param call: 用例步骤
    :return:
    """
    outcome = yield  # 获取钩子方法的调用结果
    report = outcome.get_result()  # 从调用结果中获取测试报告

    # 只获取用例运行时失败的结果，即when='call'
    if report.when == 'call' and report.failed:
        now_time = time.strftime('%Y_%m_%d_%H_%M_%S')
        # 用例失败，添加allure报告截图
        if hasattr(m_page.driver, 'get_screenshot_as_png'):
            with allure.step('添加失败截图'):
                logger.info(f'添加失败截图')
                allure.attach(m_page.driver.get_screenshot_as_png(), f'失败截图_{now_time}',
                              allure.attachment_type.PNG)


def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时，将收集到的用例的name和nodeid的中文显示在控制台上
    name: 用例的名称
    nodeid：用例的路径
    :param items: 收集到的所有用例
    :return:
    """
    for item in items:
        item.name = item.name.encode('utf-8').decode('unicode_escape')
        item._nodeid = item.nodeid.encode('utf-8').decode('unicode_escape')
